package com.loveprogrammer.lowercode.dna.instance.bo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import com.loveprogrammer.lowercode.dna.common.CodeDefConst;
import com.loveprogrammer.lowercode.dna.common.OperationFlagEnum;
import com.loveprogrammer.lowercode.dna.def.Dna;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/***
 * 元数据实例类，描述具体领域模型
 * inst是一组具体领域对象的包装，用于一些参数的封装，例如total
 * Inst类可以将多个cell对象组织在一起放入list中，inst类的其它属性则是描述List的整体信息
 */
@Data
public class Inst implements Cloneable{
    protected String businessType;
    
    protected Dna dna;
    
    protected String dnaCode;
    protected String dnaName;
    protected String instType = CodeDefConst.INST_TYPE_DEFAULT;

    // 当进行分页查询返回对象时，total属性被用来记录复合条件的总条数，在非分页条件查询返回inst对象时，total被设置为-1，表示该属性值没有意义
    protected int total = -1;

    // Cell又嵌套了inst类，形成一个树形结构
    @JsonIgnore
    private Cell parentCell;
    
    private List<Cell> cells = new ArrayList<Cell>();

    public Inst(String instType, Dna dna, Cell cell) {
        this.instType = instType;
        this.dna = dna;
        this.cells.add(cell);
    }

    public Cell getSingleCell() {
//        Cell cell = new Cell();
//        cell.setDnaCode(dnaCode);
//        cell.setOperationFlag(OperationFlagEnum.ADD.getCode());
//        cell.setOwner(this);
//        cell.setId(System.currentTimeMillis());
//        cell.setVas(new HashMap<>());
//        this.cells.add(cell);
        if(this.cells.size() != 1) {
            throw new RuntimeException("非唯一值Cell");
        }
        return cells.get(0);
    }

    public void addCell(Cell cell) {
        // TODO id不能重复
        this.cells.add(cell);
    }

    @Override
    public String toString() {
        return "Inst{" +
                "businessType='" + businessType + '\'' +
                ", dna=" + dna +
                ", dnaCode='" + dnaCode + '\'' +
                ", dnaName='" + dnaName + '\'' +
                ", instType='" + instType + '\'' +
                ", total=" + total +
                ", cells=" + cells +
                '}';
    }
}
